package com.southwind.proxy.jdk;

import com.southwind.proxy.DBQuery;
import com.southwind.proxy.IDBQuery;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * jdk动态代理实现DBQuery
 * <p>
 * Created by chenhs on 2018/11/23.
 * <p>
 * 内部逻辑和 DBQueryProxy 是类似的。在调用真实主题的方法前，先尝试生成真实主题对象。
 * 接着，需要使用这个 Handler 生成动态代理对象。
 */
public class DBQueryHandler implements InvocationHandler {

    IDBQuery realQuery = null;  //定义主题接口

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //如果第一次调用，生成真实主题
        if (realQuery == null) {
            realQuery = new DBQuery();
        }
        //返回真正主题完成实际的操作
        return realQuery.request();
    }


    public static IDBQuery createProxy() {
        IDBQuery proxy = (IDBQuery) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader()
                , new Class[]{IDBQuery.class}, new DBQueryHandler());

        return proxy;
    }
}
